package org.jeecg.modules.file.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.modules.file.entity.ProcurementFile;
import org.jeecg.modules.file.service.IProcurementFileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@Slf4j
@Api(tags="附件111")
@RestController
@RequestMapping("/ProcurementFile")
public class ProcurementFileController {
    @Autowired
    private IProcurementFileService procurementFileService;

    /**
     * 分页列表查询
     * @return 分页结果
     */
    @AutoLog(value = "附件-分页列表查询")
    @ApiOperation(value="附件-分页列表查询", notes="附件-分页列表查询")
    @GetMapping(value = "/list")
    public Result<?> queryPageList(@RequestParam(defaultValue = "1") Integer pageNo,
                                   @RequestParam(defaultValue = "10") Integer pageSize) {
        // 校验分页参数
        if (pageNo == null || pageNo <= 0) {
            return Result.error("页码必须大于0");
        }
        if (pageSize == null || pageSize <= 0) {
            return Result.error("每页数量必须大于0");
        }

        Page<ProcurementFile> page = new Page<>(pageNo, pageSize);
        page = procurementFileService.page(page);
        if (page.getTotal() == 0) {
            return Result.OK("未查询到评价", page);
        }
        return Result.OK(procurementFileService.page(page));
    }

    /**
     * 文件下载接口
     * 根据文件ID下载文件到本地
     *
     * @param id 文件ID
     * @param response 响应对象
     * @return 响应结果
     */
    @GetMapping(value = "/download")
    @AutoLog(value = "附件-文件下载")
    @ApiOperation(value="附件-文件下载", notes="附件-文件下载")
    public Result<?> downloadFile(@RequestParam(name="id", required=true) String id, HttpServletResponse response) {
        // 校验文件ID
        if (id == null || id.trim().isEmpty()) {
            return Result.error("文件ID不能为空");
        }
        try {
            procurementFileService.downloadFile(id, response);
            return null;
        } catch (Exception e) {
            log.error("文件下载失败", e);
            return Result.error("文件下载失败：" + e.getMessage());
        }
    }

    /**
     * 添加
     * @param procurementFile 实体对象
     * @return 添加结果
     */
    @AutoLog(value = "附件-添加")
    @ApiOperation(value="附件-添加", notes="附件-添加")
    @PostMapping(value = "/add")
    public Result<?> add(@RequestBody ProcurementFile procurementFile) {
        // 校验实体对象
        if (procurementFile == null) {
            return Result.error("附件信息不能为空");
        }
        try {
            procurementFileService.save(procurementFile);
            return Result.OK("添加成功！");
        } catch (Exception e) {
            log.error("添加失败", e);
            return Result.error("添加失败：" + e.getMessage());
        }
    }

    /**
     * 删除
     * @param id 文件ID
     * @return 删除结果
     */
    @AutoLog(value = "附件-删除")
    @ApiOperation(value="附件-删除", notes="附件-删除")
    @DeleteMapping(value = "/delete")
    public Result<?> delete(@RequestParam(name="id", required=true) String id) {
        // 校验文件ID
        if (id == null || id.trim().isEmpty()) {
            return Result.error("文件ID不能为空");
        }
        try {
            boolean success = this.procurementFileService.removeById(id);
            if (success) {
                return Result.OK("删除成功！");
            } else {
                return Result.error("删除失败，文件不存在");
            }
        } catch (Exception e) {
            log.error("删除失败", e);
            return Result.error("删除失败：" + e.getMessage());
        }
    }

    /**
     * 文件上传
     * @param files 文件数组
     * @param bizId 业务ID
     * @param bizType 业务类型
     * @return 上传结果
     */
    @AutoLog(value = "附件-文件上传")
    @ApiOperation(value="附件-文件上传", notes="附件-文件上传")
    @PostMapping(value = "/upload")
    public Result<?> upload(@RequestParam(name="files", required=true) MultipartFile[] files,
                            @RequestParam(name="bizId", required=true) String bizId,
                            @RequestParam(name="bizType", required=true) String bizType) {
        // 校验文件数组
        if (files == null || files.length == 0) {
            return Result.error("文件不能为空");
        }
        // 校验业务ID和类型
        if (bizId == null || bizId.trim().isEmpty()) {
            return Result.error("业务ID不能为空");
        }
        if (bizType == null || bizType.trim().isEmpty()) {
            return Result.error("业务类型不能为空");
        }

        try {
            List<ProcurementFile> resultList = procurementFileService.uploadFiles(files, bizId, bizType);
            return Result.OK(resultList);
        } catch (IOException e) {
            log.error("文件上传失败", e);
            return Result.error("文件上传失败：" + e.getMessage());
        }
    }

    /**
     * 根据业务查询文件
     * @param bizId 业务ID
     * @param bizType 业务类型
     * @return 文件列表
     */
    @AutoLog(value = "附件-根据业务查询")
    @ApiOperation(value="附件-根据业务查询", notes="附件-根据业务查询")
    @GetMapping(value = "/queryByBiz")
    public Result<?> queryByBiz(@RequestParam(name="bizId", required=true) String bizId,
                                @RequestParam(name="bizType", required=true) String bizType) {
        // 校验业务ID和类型
        if (bizId == null || bizId.trim().isEmpty()) {
            return Result.error("业务ID不能为空");
        }
        if (bizType == null || bizType.trim().isEmpty()) {
            return Result.error("业务类型不能为空");
        }
        try {
            List<ProcurementFile> list = procurementFileService.getFilesByBiz(bizId, bizType);
            return Result.OK(list);
        } catch (Exception e) {
            log.error("查询失败", e);
            return Result.error("查询失败：" + e.getMessage());
        }
    }

    // 上传Excel文件
    @AutoLog(value = "附件-上传Excel文件")
    @ApiOperation(value="附件-上传Excel文件", notes="附件-上传Excel文件:Excel模板下载 id:1969640695701999617")
    @PostMapping(value = "/uploadExcel")
    public Result<?> uploadExcel(@RequestParam(name="file", required=true) MultipartFile file,
                                 @RequestParam(name="bizId", required=true) String bizId,
                                 @RequestParam(name="bizType", required=true) String bizType) {
        // 校验文件
        if (file == null || file.isEmpty()) {
            return Result.error("Excel文件不能为空");
        }
        // 校验业务ID和类型
        if (bizId == null || bizId.trim().isEmpty()) {
            return Result.error("业务ID不能为空");
        }
        if (bizType == null || bizType.trim().isEmpty()) {
            return Result.error("业务类型不能为空");
        }

        try {
            List<ProcurementFile> resultList = procurementFileService.uploadExcel(file, bizId, bizType);
            return Result.OK(resultList);
        } catch (IOException e) {
            log.error("文件上传失败", e);
            return Result.error("文件上传失败：" + e.getMessage());
        }
    }
}
